package modulos.usuario.modelo;

import basedatos.OperacionesBD;
import basedatos.UsuarioBD;
import java.io.Serializable;
import java.util.List;
import javax.persistence.*;
import modelo.Persona;
import modulos.reservacion.modelo.Reservacion_Config;
import modulos.usuario.vista.iFrmUsuario;

/**
 *
 * @author caesar
 */
@Entity
//@NamedQueries({
//    @NamedQuery(name = "CtaUsr.findAll", query = "SELECT p FROM Pyme p"),
//    @NamedQuery(name = "CtaUsr.findByCedula", query = "SELECT cu Cuenta_Usuario cu WHERE cu.cedula= :cedula"),
//    @NamedQuery(name = "CtaUsr.findByUsuario", query = "SELECT cu Cuenta_Usuario cu WHERE cu.usuario= :usuario"),
//    @NamedQuery(name = "CtaUsr.delete", query = "DELETE FROM Pyme p WHERE p.id = :id")
//})
public class Cuenta_Usuario implements Serializable {

    @Id
    @GeneratedValue//(strategy = GenerationType.AUTO)
    @Column(name = "idCuenta")
    private int idCuenta;
    private String usuario;
    private String clave;
    private String tipo;
    private String estado;
    @OneToOne(mappedBy = "cuentaUsr", cascade= CascadeType.ALL)//@OneToOne(cascade= CascadeType.ALL)
    private Usuario user;//para el idCuenta

    public Cuenta_Usuario() {
    }

    public int getId() {
        return idCuenta;
    }

    public void setId(int idCuenta) {
        this.idCuenta = idCuenta;
    }

    public String getNomUsuario() {
        return usuario;
    }

    public void setNomUsuario(String usuario) {
        this.usuario = usuario;
    }

    public String getClave() {
        return clave;
    }

    public void setClave(String clave) {
        this.clave = clave;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public String getEstado() {
        return estado;
    }

    public void setEstado(String estado) {
        this.estado = estado;
    }

    public Usuario getEntidadUsuario() {
        return user;
    }

    public void setEntidadUsuario(Usuario user) {
        this.user = user;
    }

    public boolean insertUsuario(Usuario eU, Cuenta_Usuario eCu) {
        UsuarioBD ubd = new UsuarioBD();
        if (ubd.persistir(eCu) == 1) {
            eU.setCuentaUsr(eCu);
            if (ubd.persistir(eU) == 1) {
                OperacionesBD.guardar(new Permiso(eU));
                if (eCu.getTipo().equalsIgnoreCase(iFrmUsuario.TIPO_MEDICO)) {
                    OperacionesBD.guardar(new Reservacion_Config(eU));
                }
                return true;
            }//revisar rollback
        }
        return false;
    }

    public List<Object[]> loginUsuarioDefault() throws Exception {
        Cuenta_Usuario cu = new Cuenta_Usuario();
        UsuarioBD ubd = new UsuarioBD();
        cu = ubd.selectUsuarioDefault();
        return this.loginUsuario(cu);
    }

    public List<Object[]> loginUsuario(Cuenta_Usuario eCu) throws Exception {
        List<Object[]> lsUsuario = null;
        Cuenta_Usuario cu = new Cuenta_Usuario();
        UsuarioBD ubd = new UsuarioBD();
        String cmdSql = "Select cu, u, p From Cuenta_Usuario cu, Usuario u, Persona p Where cu.usuario = :usuario And u.cuentaUsr = cu.idCuenta And p.idPersona = u.idPersona";
        lsUsuario = ubd.selectAtributosAll(cmdSql, eCu.getNomUsuario());
        if (lsUsuario.size() == 1) {
            for (Object[] o : lsUsuario) {
                cu = (Cuenta_Usuario) o[0];
            }
            if (cu.getClave().compareTo(eCu.getClave()) == 0) {
                return lsUsuario;
            }
        }
        return null;
    }

    public List<Object> selectUsuario() throws Exception {//selecciona solo la tabla Cuenta_Usuario
        UsuarioBD ubd = new UsuarioBD();
        return ubd.listar("Cuenta_Usuario");
    }

    public Cuenta_Usuario selectCuentaUsuario() throws Exception {//pendiente de uso
        UsuarioBD ubd = new UsuarioBD();
        List<Cuenta_Usuario> lscu = ubd.lista("Cuenta_Usuario", "");
        Cuenta_Usuario cu = lscu.get(0);//(Cuenta_Usuario)lscu.get(0);
        return cu;
    }//metodo OK

    public boolean setupUserAdministrador() throws Exception {
        Usuario u = new Usuario();
        u.setNombre("Medikux");
        u.setApellido("Medikux");
        u.setCedula("0000000000");
        u.setActividad("Soporte técnico");
        u.setEspecialidad("Sistemas");
        u.setEstudios("Tecnologías de la Información y Comunicación (TIC)");

        Cuenta_Usuario cu = new Cuenta_Usuario();
        cu.setNomUsuario("admin".trim());
        cu.setClave("".trim());
        cu.setEstado("A");
        cu.setTipo("ADMINISTRADOR".toUpperCase().trim());

        return this.insertUsuario(u, cu);
    }

    public int preSetupUserManager() throws Exception {//vrf already u
        UsuarioBD ubd = new UsuarioBD();
        if (ubd.getManager() > 0) {
            return 1;
        }
        return 0;
    }
    /////////////

    public boolean updatetUsuario(Cuenta_Usuario eCu) throws Exception {//usado desde cambio de claves y desde ...
        UsuarioBD ubd = new UsuarioBD();
        if (ubd.updateRegistro(eCu) == 1) {
            return true;
        }
        return false;
    }

    public int updateInfoUsuario(Persona p, Usuario u) throws Exception {
        UsuarioBD ubd = new UsuarioBD();
        if (ubd.updatePersona(p) == 1) {
            if (ubd.updateUsuario(u) == 1) {
                return 1;
            }
        }
        return 0;
    }

    public String validarAtributoDuplicado(int idPersona, String cedula, String usuario, int idCuenta) {//verifica cedula y usuario ya existentes para controlar duplicidad de estos atributos
        UsuarioBD ubd = new UsuarioBD();
        try {
            if (idPersona <= 0)//p insert
            {
                if (ubd.selectAtributo("Select Count(*) From Usuario Where cedula =\'" + cedula + "\'") > 0) {
                    return "c";
                }
                if (ubd.selectAtributo("Select Count(*) From Cuenta_Usuario Where usuario =\'" + usuario + "\'") > 0) {
                    return "u";//returna u si se intenta guardar un nombre de usuario duplicado
                }
            } else//p up
            {
                if (ubd.selectAtributo("Select Count(*) From Usuario Where cedula =\'" + cedula + "\' And idPersona <>" + idPersona) > 0) {
                    return "c";
                }
                if (ubd.selectAtributo("Select Count(*) From Cuenta_Usuario Where usuario =\'" + usuario + "\' And idCuenta <>" + idCuenta) > 0) {
                    return "u";
                }
            }
        } catch (Exception ex) {
            ex.getCause();
        }
        return null;//si no hay alguien con estos atributos retorna null, significa q podemos almacenar estos atributos
    }

    public List<Object[]> selectAtributosUsuario(String usuario) throws Exception {
        Object obj = null;
        UsuarioBD ubd = new UsuarioBD();
        String cmdSql = "Select cu, u, p From Cuenta_Usuario cu, Usuario u, Persona p Where cu.usuario = :usuario And u.cuentaUsr = cu.idCuenta And p.idPersona = u.idPersona";
        return ubd.selectAtributosAll(cmdSql, usuario);
    }

    
}
